ピボットテーブル

Excelにあるピボットテーブルのような表を作成

例)レストランにおけるチップ金額のデータ
total_bill : 飲食代(税込)
tip : チップの金額
sex : 性別(Male,Female)
smoker : 喫煙者がいたかどうか(Yes,No)
day : 曜日(Thur,Fri,Sat,Sun)
time : 時間帯(Lunch,Dinner)
size : グループの人数

library(reshape2)
data(tips)
head(tips)
##   total_bill  tip    sex smoker day   time size
## 1      16.99 1.01 Female     No Sun Dinner    2
## 2      10.34 1.66   Male     No Sun Dinner    3
## 3      21.01 3.50   Male     No Sun Dinner    3
## 4      23.68 3.31   Male     No Sun Dinner    2
## 5      24.59 3.61 Female     No Sun Dinner    4
## 6      25.29 4.71   Male     No Sun Dinner    4

チップ金額を金額別に階級分けして、他の変数とのピボットテーブルを作成

tips$y <- cut(tips$tip, breaks = c(0, 2, 4, 6, 8, 10))  # tipsを階級分け
table(tips$y)
## 
##  (0,2]  (2,4]  (4,6]  (6,8] (8,10] 
##     78    125     34      5      2

ピボットテーブル(度数)の作成

acast(tips, y ~ sex + smoker, length)
## Using y as value column: use value.var to override.
##        Female_No Female_Yes Male_No Male_Yes
## (0,2]         19          9      29       21
## (2,4]         27         19      49       30
## (4,6]          8          4      15        7
## (6,8]          0          1       3        1
## (8,10]         0          0       1        1

セルごとに指定した変数の総和や平均などを求めたい場合は,
value.varで変数名を指定する

acast(tips, y ~ sex + smoker, sum, value.var = "total_bill")
##        Female_No Female_Yes Male_No Male_Yes
## (0,2]      244.9     106.21  374.21   345.33
## (2,4]      484.4     354.37  943.02   742.74
## (4,6]      248.3     104.52  432.20   175.02
## (6,8]        0.0      28.17  121.99    23.17
## (8,10]       0.0       0.00   48.33    50.81

3次元のクロス表にしたい場合

acast(tips, y ~ sex ~ smoker, sum, value.var = "total_bill")
## , , No
## 
##        Female   Male
## (0,2]   244.9 374.21
## (2,4]   484.4 943.02
## (4,6]   248.3 432.20
## (6,8]     0.0 121.99
## (8,10]    0.0  48.33
## 
## , , Yes
## 
##        Female   Male
## (0,2]  106.21 345.33
## (2,4]  354.37 742.74
## (4,6]  104.52 175.02
## (6,8]   28.17  23.17
## (8,10]   0.00  50.81